package com.blade.workstation.common;

import lombok.Data;

/**
 * 统一响应结果类
 * 用于封装API接口的返回数据
 * @param <T> 数据类型
 */
@Data
public class R<T> {

    /**
     * 响应状态（true-成功，false-失败）
     */
    private Boolean success;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 私有构造函数，防止外部直接实例化
     */
    private R() {
    }

    /**
     * 私有构造函数，用于内部创建实例
     * @param success 成功状态
     * @param message 响应消息
     * @param data 响应数据
     */
    private R(Boolean success, String message, T data) {
        this.success = success;
        this.message = message;
        this.data = data;
    }

    /**
     * 成功响应（无数据）
     * @param <T> 数据类型
     * @return R 响应对象
     */
    public static <T> R<T> ok() {
        return new R<>(true, "操作成功", null);
    }

    /**
     * 成功响应（带数据）
     * @param data 响应数据（必填）
     * @param <T> 数据类型
     * @return R 响应对象
     */
    public static <T> R<T> ok(T data) {
        return new R<>(true, "操作成功", data);
    }

    /**
     * 成功响应（带数据和自定义消息）
     * @param data 响应数据（必填）
     * @param message 响应消息（必填）
     * @param <T> 数据类型
     * @return R 响应对象
     */
    public static <T> R<T> ok(T data, String message) {
        return new R<>(true, message, data);
    }

    /**
     * 失败响应（默认消息）
     * @param <T> 数据类型
     * @return R 响应对象
     */
    public static <T> R<T> fail() {
        return new R<>(false, "操作失败", null);
    }

    /**
     * 失败响应（自定义消息）
     * @param message 错误消息（必填）
     * @param <T> 数据类型
     * @return R 响应对象
     */
    public static <T> R<T> fail(String message) {
        return new R<>(false, message, null);
    }

    /**
     * 失败响应（自定义消息和数据）
     * @param message 错误消息（必填）
     * @param data 响应数据
     * @param <T> 数据类型
     * @return R 响应对象
     */
    public static <T> R<T> fail(String message, T data) {
        return new R<>(false, message, data);
    }
}

